/*
 * Đề số 2: Lập trình MIDlet thực hiện
	Vẽ một bàn cờ carô các ô vuông lên màn hình, có một ô được chọn trên đó,
	Xử lý phím mũi tên để di chuyển ô chọn,
	Xử lý phím FIRE (chọn) để đánh dấu luân phiên O/X vào ô đang chọn, nếu ô đã có thì vẽ đè lên,
	Có nút lệnh bên phải màn hình: tính toán xem có bên nào thắng hay không theo kết quả đã đánh trên màn hình và thông báo.

 */
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.GameCanvas;

    
    
class DOHOA extends GameCanvas implements CommandListener{
    
    int CanhHV=20;
    int a[][],Ci,Cj,Kt;
    
     Command cmdThoat=new Command("Thoát",Command.EXIT,0);
     Command cmdKiemTra=new Command("Kiểm tra",Command.OK,0);
    DOHOA(){
        super(false);        
        veBanco();        
        this.addCommand(cmdThoat);
        this.addCommand(cmdThoat);
        
    }
    
    void veBanco(){
        Graphics g=getGraphics();
        int Hang=getHeight()/CanhHV;
        int Cot=getWidth()/CanhHV;
        
        a=new int[Hang][Cot];
        Kt=2;
        Ci=Cj=0;
        for(int i=0;i<Cot;i++){
                for(int j=0;j<Hang;j++){
                    g.setColor(0,255,0);
                    g.drawRect(i*CanhHV, j*CanhHV, CanhHV, CanhHV);                   
                }
        }
        flushGraphics();        
     }    
    
    void veOchon(int red,int green,int blue){
        Graphics g=getGraphics();
        g.setColor(red,green,blue);
        g.drawRect(Ci*CanhHV, Cj*CanhHV, CanhHV, CanhHV);
        flushGraphics();
    }
    
    void veXO(int i, int j){
        /*
         * gia tri a[i][j]:
         *  - 0 : chưa đánh
         *  - 1 : đánh O
         *  - 2 : đánh X
         */
        Graphics g=getGraphics();
        if(a[i][j]==0){
            switch(Kt){
                case 2://chưa đánh(hoặc đã đánh X)=> đánh dấu O và đổi Kt=1;                   
                    g.setColor(0,0,255);
                    g.drawArc(i*CanhHV+1, j*CanhHV+1,CanhHV-2, CanhHV-2, 0, 360);                    
                    a[i][j]=Kt=1;
                    break;
                case 1://Bước trước đánh O => đánh X và đổi Kt=0;                  
                    g.setColor(0,0,0);
                    g.drawLine(i*CanhHV+1,j*CanhHV+1, i*CanhHV+CanhHV, j*CanhHV+CanhHV);
                    g.drawLine(i*CanhHV+1,j*CanhHV+CanhHV, i*CanhHV+CanhHV, j*CanhHV+1);
                    a[i][j]=Kt=2;
                    break;                
        }
            flushGraphics();
       }else if(a[i][j]==1){//đang là O
                    g.setColor(255,255,255);
                    g.drawArc(i*CanhHV+1, j*CanhHV+1,CanhHV-2, CanhHV-2, 0, 360); 
                    g.setColor(0,0,0);
                    g.drawLine(i*CanhHV+1,j*CanhHV+1, i*CanhHV+CanhHV, j*CanhHV+CanhHV);
                    g.drawLine(i*CanhHV+1,j*CanhHV+CanhHV, i*CanhHV+CanhHV, j*CanhHV+1);
                    a[i][j]=2;
                    flushGraphics();
        }else if(a[i][j]==2){//đang là X
                    g.setColor(255,255,255);
                    g.drawLine(i*CanhHV+1,j*CanhHV+1, i*CanhHV+CanhHV, j*CanhHV+CanhHV);
                    g.drawLine(i*CanhHV+1,j*CanhHV+CanhHV, i*CanhHV+CanhHV, j*CanhHV+1);
                     g.setColor(0,0,255);
                    g.drawArc(i*CanhHV+1, j*CanhHV+1,CanhHV-2, CanhHV-2, 0, 360);     
                    a[i][j]=1;
                    flushGraphics();
        }
                        
    }
    
    protected void keyPressed(int keyCode) {
        int p=getGameAction(keyCode);
        
        veOchon(0,255,0);
            if(p==LEFT&&Ci>0)Ci--;
            if(p==RIGHT&&Ci<(getWidth()/CanhHV)-1)Ci++;
            if(p==UP&&Cj>0)Cj--;
            if(p==DOWN&&Cj<(getHeight()/CanhHV)-1)Cj++;
            if(p==FIRE) veXO(Ci,Cj);
        veOchon(255,0,0);
    }

    public void commandAction(Command c, Displayable d) {
        
    }
    
    
        
}
    
public class DE2 extends MIDlet {

    public void startApp() {
       
        
        Display.getDisplay(this).setCurrent(new DOHOA());        
            
    }
    
    public void pauseApp() {
    }
    
    public void destroyApp(boolean unconditional) {
    }
}
